

from rest_framework import serializers
from goods.models import SKUImage,SKU

# 新增图片可选sku序列化器
class SKUSimpleSerializer(serializers.ModelSerializer):
    class Meta:
        model = SKU
        fields = [
            'id',
            'name'
        ]

# 图片序列化器
class ImageModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = SKUImage
        fields = [
            'id',
            # 关联sku对象，默认类型为PrimayKeyRelatedField：(1)、序列化结果就是主键值；(2)、反序列化的结果是关联对象
            'sku',
            # ImageField类型: (1)、序列化结果为image.url属性即图片URL；(2)、反序列化结果为一个图片文件对象
            'image'
        ]

    # 重写validate函数，实现在校验的过程中通过fdfs客户端上传图片
    def validate(self, attrs):
        # 1、获取浏览器传递过来的图片数据
        f = attrs.get('image') # 有效数据中image字段记录一个文件对象
        content = f.read() # 通过该文件对象读取文件二进制数据
        # 2、调用fdfs客户端上传图片
        from fdfs_client.client import Fdfs_client
        from django.conf import settings
        conn = Fdfs_client(settings.FDFS_CONFIG_PATH)
        ret = conn.upload_by_buffer(content)
        # 3、获取上传之后的图片id —— 该id值作为最终的有效数据存储mysql
        if not (ret and ret['Status'] == 'Upload successed.'):
            raise serializers.ValidationError('fdfs图片上传失败！')

        file_id = ret['Remote file_id']
        # 需要把有效数据中的image字段值修改为file_id值，保存mysql中
        attrs['image'] = file_id
        return attrs